package com.ks.winterwarmimage.mqtt.service;

import org.eclipse.paho.client.mqttv3.MqttMessage;

import java.util.Iterator;

/**
 * <p>
 * 持久化消息直到我们知道它们已被接收的机制
 * </p>
 * <ul>
 * <li>服务应在消息通过{@link #storeArrived(String, String, MqttMessage)}到达时存储消息。
 * <li>当消息传递给消费实体时，应调用{@link #discardArrived(String, String)}。
 * <li>要恢复尚未明确传递给消费者的消息，请使用{@link MessageStore#getAllArrivedMessages(String)}。
 * <li>启动清除会话时，使用{@link #clearArrivedMessages(String)}。
 * used.
 * </ul>
 */
interface MessageStore {

 /**
  * 存储消息的额外描述
  */
 interface StoredMessage {
  /**
   * @return 存储中消息的标识符
   */
  String getMessageId();

  /**
   * @return 存储此消息的客户端的标识符
   */
  String getClientHandle();

  /**
   * @return 收到消息的主题
   */
  String getTopic();

  /**
   * @return 存储此消息的客户端的标识符
   */
  MqttMessage getMessage();
 }

 /**
  * 存储消息并返回其标识符
  *
  * @param clientHandle
  *            客户端的标识符
  * @param message
  *            要存储的消息
  * @return 它的唯一标识符
  */
 String storeArrived(String clientHandle, String Topic,
                     MqttMessage message);

 /**
  * 丢弃消息-当我们确定到达的消息已到达应用程序时调用。
  *
  * @param clientHandle 客户端的标识符
  * @param id 要丢弃的消息的id
  */
 boolean discardArrived(String clientHandle, String id);

 /**
  * 获取所有存储的消息，通常针对特定客户端
  *
  * @param clientHandle 客户端的标识符 - 如果为null，则返回所有客户端的消息
  */
 Iterator<StoredMessage> getAllArrivedMessages(String clientHandle);

 /**
  * 丢弃存储的消息，通常针对特定客户端
  *
  * @param clientHandle 客户端的标识符 - 如果为null，则丢弃所有客户端的消息
  */
 void clearArrivedMessages(String clientHandle);

 void close();
}